package com.bmob.lover.viewmodel.base

import com.bmob.lover.app.ext.*
import com.bmob.lover.app.util.CacheUtil
import com.bmob.lover.app.util.CacheUtil.getLoverBind
import com.bmob.lover.app.util.getCurrentUser
import com.bmob.lover.data.model.bean.LoverBind
import com.bmob.lover.data.model.bean.User

//  ┏┓　　　┏┓
//┏┛┻━━━┛┻┓
//┃　　　　　　　┃
//┃　　　━　　　┃
//┃　┳┛　┗┳　┃
//┃　　　　　　　┃
//┃　　　┻　　　┃
//┃　　　　　　　┃
//┗━┓　　　┏━┛
//    ┃　　　┃                  神兽保佑
//    ┃　　　┃                  永无BUG！
//    ┃　　　┗━━━┓
//    ┃　　　　　　　┣┓
//    ┃　　　　　　　┏┛
//    ┗┓┓┏━┳┓┏┛
//      ┃┫┫　┃┫┫
//      ┗┻┛　┗┻┛
/**
 * @author The one
 * @date 2021-04-23 09:59
 * @describe 统一的请求封装
 * @email 625805189@qq.com
 * @remark
 */
abstract class BaseLoverRequestViewModel<T> :
    BaseListRequestViewModel<T>() {

    var mLover: User? = CacheUtil.getLover()
    var mAuthorQuery: String = ""
    var mLoverQuery: String = ""
    var isBindLover: Boolean = false

    init {
        mUser?.run {
            isBindLover = null != mLover
            val loverId = getLoverId()
            mAuthorQuery = assembly(equal("author", mUserId), equal("lover", loverId))
            if (isBindLover) {
                mLoverQuery = assembly(equal("lover", mUserId), equal("author", loverId))
            }
            // TODO 避免新用户没数据展示，这里直接将管理员发布的显示出来
            else if (isTest()) {
                mLoverQuery = assembly(equal("author", "45f6504c42"), equal("author", loverId))
            }
        }
    }

    private fun getLoverId(): String {
        return mLover?.objectId ?: ""
    }

    /**
     * 正式的去掉与这个相关的代码
     * @return Boolean
     */
    private fun isTest(): Boolean = mUser?.isAdmin == false && (mTableName == "Lover" || mTableName == "Album")

    override fun where(): String =
        if (isBindLover)
            and(
                assembly(isDelete, otherWhere()),
                or(mAuthorQuery, mLoverQuery)
            )
        else {
            if (isTest()) {
                or(
                    and(
                        assembly(isDelete, equal("author", "5f7d1183c9"), otherWhere()),
                        or(assembly(exists("lover", false)), assembly(equal("lover", "")))
                    ),
                    and(
                        assembly(isDelete, equal("author", mUserId), otherWhere()),
                        or(assembly(exists("lover", false)), assembly(equal("lover", "")))
                    )
                )
            } else
                and(
                    assembly(isDelete, equal("author", mUserId), otherWhere()),
                    or(assembly(exists("lover", false)), assembly(equal("lover", "")))
                )
        }


}
